package com.safframework.server.core.handler.socket

import io.netty.buffer.ByteBuf
import io.netty.channel.Channel
import io.netty.handler.codec.http.HttpHeaders
import io.netty.handler.codec.http.websocketx.PingWebSocketFrame
import io.netty.handler.codec.http.websocketx.PongWebSocketFrame

/**
 * webSocket回调接口，提供打开链接、关闭连接、StringMessage和BinaryMessage支持
 * @author cheng
 */
interface WebSocketListener<T> {

    /**
     * 与客户端建立连接，添加http参数支持和http请求头支持
     *
     * @param channel
     */
    fun onOpenMessage(
        channel: Channel,
        headers: HttpHeaders,
        params: Map<String, List<String>>
    )

    /**
     * 文本消息处理
     * @param textMsg 文本消息内容
     * @param channel 消息通道
     */
    fun onTextMessage(textMsg: String, channel: Channel)

    /**
     * 二进制消息处理
     * @param binaryMsg 二进制消息内容
     * @param channel 消息通道
     */
    fun onBinaryMessage(binaryMsg: ByteBuf, channel: Channel)

    /**
     * 默认原样返回客户端的ping消息
     */
    fun onPingMessage(frame: PingWebSocketFrame, channel: Channel) {
        channel.writeAndFlush(PongWebSocketFrame(frame.content().retain()))
    }

    fun onCloseMessage(channel: Channel)
}
